package controller;

import exception.SomeException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

/**
 * Author:shixiaojun@itany.com
 * Date:2022/5/20 14:52
 * Version:1.0-SNAPSHOT
 * Description:
 */
@Controller
@RequestMapping("/url")
public class URLController {

    // ANT风格
    // 匹配一层路径
    @RequestMapping("/f1/*")
    public void f1() throws SomeException {
        System.out.println("URLController.f1");
        throw new SomeException("执行url中的f1遇到了异常");
    }

    // 匹配0或多层路径
    @RequestMapping("/f2/**")
    public void f2(){
        System.out.println("URLController.f2");
    }

    // 只匹配一个字符
    @RequestMapping("/f3/?")
    public void f3(){
        System.out.println("URLController.f3");
    }

    @RequestMapping("/f4/a?")
    public void f4(){
        System.out.println("URLController.f4");
    }

    // REST风格配置
    // 当参数被@PathVariable(key)进行标注时
    // 表示将url地址部分的{key}的值注入到当前参数中
    // 根据占位符{xxx}中的xxx内容与注解@PathVariable(key)中的参数key进行匹配
    // 当占位符的内容与注解参数一致时,会将占位符位置实际输入的地址值注入到注解所对应的参数
    // 每一个占位符表示一层路径
    @RequestMapping("/f5/{name}")
    public void f5(@PathVariable("name") String name){
        System.out.println("name:"+name);
    }

    // 注解的参数可以省略
    // 默认即为当前的变量名
    @RequestMapping("/f6/{username}/{password}")
    public void f6(@PathVariable String username, @PathVariable String password){
        System.out.println("username:"+username+",password:"+password);
    }

    @RequestMapping("/f7/{username}/{password}")
    public void f7(@PathVariable("password") String username, @PathVariable("username") String password){
        System.out.println("username:"+username+",password:"+password);
    }

    // 此时如果输入非数字,也会进入方法
    // 只是在进入方法对参数值进行处理的时候报错
    // 错误400,服务器内部转换出错
    // 既然是一个Integer类型的参数,遇到非数字,就不应该让它正常访问
    // 访问了就浪费资源
    @RequestMapping("/f8/{id}")
    public void f8(@PathVariable Integer id){
        System.out.println("id:"+id);
    }

    // 此时可以对用户输入的地址值进行校验
    // 此时应该只有输入数字才能正常访问
    // REST风格地址支持正则表达式
    // {占位符:正则表达式}表示对占位符的值进行校验
    // 只有校验通过才能正常访问
    @RequestMapping("/f9/{id:\\d+}")
    public void f9(@PathVariable Integer id){
        System.out.println("id:"+id);
    }

    @ResponseBody
    @RequestMapping(value = "/f10",method = RequestMethod.GET)
    public String f10(){
        System.out.println("URLController.f10");
        return "<h1>Hello GET</h1>";
    }

    @ResponseBody
    @RequestMapping(value = "/f11",method = RequestMethod.POST)
    public String f11(){
        System.out.println("URLController.f11");
        return "<h1>Hello POST</h1>";
    }

    @ResponseBody
    @GetMapping("/f12")
    // @GetMapping("/f12")=@RequestMapping(value = "/f12",method = RequestMethod.GET)
    public String f12(){
        return "<h1>Hello Get</h1>";
    }

    @RequestMapping(value = "/f13",params = "username")
    public void f13(){
        System.out.println("URLController.f13");
    }

    @RequestMapping(value = "/f14",params = "username=admin")
    public void f14(){
        System.out.println("URLController.f14");
    }

    @RequestMapping(value = "/f15",params = "username!=admin")
    public void f15(){
        System.out.println("URLController.f15");
    }

}
